home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FishMarket 1.0
/
FishMarket v1.0.iso
/
fishies
/
326-350
/
disk_348
/
installlibs
/
installlibs.asm
< prev
next >
Wrap
Assembly Source File
|
1992-05-06
|
9KB
|
316 lines
;***************************************************************************
; InstallLibs.asm - Jeff Glatt, dissidents
;
; Set your editor's TAB width to 3.
;
; PURPOSE:
; This program facilitates copying amiga, disk-based libraries to the LIBS
; drawer of a boot disk (i.e. greatly simplifies hard disk installation of
; custom libraries). A WB user can click on this program's icon to
; install the libraries. A CLI user can CD to the directory of this program,
; and run the program. The libraries that are copied are specified by
; altering variables in this program before assembling.
;
; REQUIREMENTS:
; The programmer must modify the block of NamePtrs to reflect the
; names of the libraries to copy. All of the libraries should be placed in
; the same drawer, and PathName should reflect that. This program should
; be placed in a drawer relative to DrawerName. (i.e. the program uses the
; exact path you specify, and does not hunt for the libs.)
; Libraries must not be > 32000 bytes in size.
;
; ASSEMBLING:
; assemble this file as Install.o
; link as follows:
; blink Install.o small.lib nodebug to InstallLibs
;C.A.P.E. assembler directives (delete these if using another asm)
ADDSYM
SMALLOBJ
OBJFILE "rad:install.o"
;================= from small.lib or amiga.lib (Commodore ==============
XREF _LVOWaitPort,_LVOGetMsg,_LVOReplyMsg
XREF _LVOCloseLibrary,_LVOOldOpenLibrary
XREF _LVODisplayAlert,_LVOCurrentDir,_LVOWrite,_LVORead,_LVOExamine
XREF _LVOOpen,_LVOClose,_LVODelay,_LVOOutput,_LVOLock,_LVOUnLock
XREF _LVOAllocMem,_LVOFreeMem
ThisTask equ $114 ;AHA! Now we don't have to use UGLY, SLOW INCLUDES!!
pr_CLI equ $AC
pr_MsgPort equ $5C
sm_ArgList equ 36
wa_Lock equ 0
TDNestCnt equ 295
MODE_NEWFILE equ 1006
MODE_OLDFILE equ 1005
bra.s StartUp
CNOP 0,4
CopyMsg dc.b 'Copying '
FileInfoBlock: ;overwrite the beginning of our program to use as a File-
;InfoBlock since we can overwrite it safely and it is
;LONG-WORD aligned. Note: this is NOT self-modifying code.
;Let's see you do this in C or Modula2.
DOSName dc.b 'dos.library',0
IntuiName dc.b 'intuition.library',0
NoMem dc.b 'Not enough memory to do installation',0
ds.b 30
CNOP 0,2
StartUp:
moveq #0,d4 ;no mem
moveq #0,d5 ;initially, assume failure
;---Get Exec library base
movea.l $0004,a6
movea.l a6,a4 ;save SysBase
;---get the address of our task
movea.l ThisTask(a6),a3
;---Open the DOS library
lea DOSName(pc),a1
jsr _LVOOldOpenLibrary(a6)
movea.l d0,a5 ;no error check because this is in ROM
;---Open the Intuition library
lea IntuiName(pc),a1
jsr _LVOOldOpenLibrary(a6)
move.l d0,d7 ;ditto
;---are we running as a son of Workbench? If not (i.e. CLI), exit
move.l pr_CLI(a3),d0
beq.s WB
suba.l a3,a3
movea.l a5,a6
jsr _LVOOutput(a6)
move.l d0,d6
bra.s clii
;---Wait for WB startup msg
WB lea pr_MsgPort(a3),a0
jsr _LVOWaitPort(a6)
lea pr_MsgPort(a3),a0
jsr _LVOGetMsg(a6)
movea.l d0,a3 ;WB msg
movea.l a5,a6 ;get DOSBase
;---get the sm_ArgList list
move.l sm_ArgList(a3),d0
beq.s _ex
movea.l d0,a0
move.l (a0),d1
jsr _LVOCurrentDir(a6)
;---Open a CON window to serve as DOS output window
_ex lea CONspec(pc),a0
move.l a0,d1
moveq #0,d2
move.w #MODE_NEWFILE,d2
jsr _LVOOpen(a6)
move.l d0,d6
;---Get a 32K buffer to load/copy libs
clii movea.l a4,a6
moveq #0,d1
moveq #0,d0
move.w #32000,d0
jsr _LVOAllocMem(a6)
lea NoMem(pc),a1
move.l d0,d4
beq dspMSG
;---Setup for loop
movea.l a5,a6
lea NamePtrs(pc),a2
lea FileInfoBlock(pc),a4
;=================== Copy libs (1 at a time) to LIBS: ================
NEXT:
;---Append the next library name to our PathName
move.l (a2),d5
beq AllDone ;is this the final 0 LONG?
lea PathName(pc),a0
bsr MakeName
;---Open the library
moveq #0,d2
move.w #MODE_OLDFILE,d2
jsr _LVOOpen(a6)
move.l d0,d5
beq.s fail3
;---Print which file we are copying
lea CopyMsg(pc),a1
bsr dsp_alert
;---Lock it
; You know, I really think that AmigaDOS is an incredibly bad DOS.
; BCPL??? No one at CBM should ever say anything bad about MS-DOS. At
; least MS-DOS is well-documented. Why couldn't the file handle have an
; easy access to the lock for the file? Because it makes good sense.
move.l a4,d1 ;I wish that they used an Addr Reg for passing
;the string name. Ugh!
moveq #-2,d2
jsr _LVOLock(a6)
move.l d0,d1
beq.s fail3
move.l d1,-(sp)
;---Get the size of the lib, and read in the entire lib
move.l a4,d2
jsr _LVOExamine(a6)
move.l (sp),d1
move.l d0,(sp)
jsr _LVOUnLock(a6)
move.l (sp)+,d0
fail3 beq.s faill
move.l 124(a4),d3 ;filesize
move.l d4,d2
move.l d5,d1
jsr _LVORead(a6)
sub.l d3,d0
bne.s faill
move.l d5,d1
jsr _LVOClose(a6)
;---Copy our buffer (lib) to LIBS:
lea SysName(pc),a0
move.l (a2)+,d5
bsr MakeName
moveq #0,d2
move.w #MODE_NEWFILE,d2
jsr _LVOOpen(a6)
move.l d0,d5
beq.s faill
;size still in d3
move.l d4,d2
move.l d5,d1
jsr _LVOWrite(a6)
sub.l d3,d0
bne.s faill
move.l d5,d1
jsr _LVOClose(a6)
bra NEXT
;---Show Success or Failure message to user, then delay
faill move.l d5,d1
beq.s fail2
jsr _LVOClose(a6)
fail2 lea Failure(pc),a1
moveq #0,d5
bra.s dspMSG
AllDone:
lea Success(pc),a1
moveq #1,d5
dspMSG:
bsr dsp_alert
;================= EXIT ROUTINE =====================
;---close the CON window if WB
move.l a3,d0
beq.s fmem
moveq #127,d1
add.l d1,d1
jsr _LVODelay(a6)
move.l d6,d1
beq.s fmem
jsr _LVOClose(a6)
;---Free 32K buffer
fmem movea.l $0004,a6
move.l d4,d0
beq.s exit
moveq #0,d0
move.w #32000,d0
movea.l d4,a1
jsr _LVOFreeMem(a6)
;---close DOS library
exit movea.l a5,a1
jsr _LVOCloseLibrary(a6)
;---Close Intuition
movea.l d7,a1
jsr _LVOCloseLibrary(a6)
;---return the startup message to our parent
move.l a3,d0
beq.s ignore
addq.b #1,TDNestCnt(a6)
movea.l a3,a1
jsr _LVOReplyMsg(a6)
;---adjust for our DOS cmd buffer
ignore:
;---this rts sends us back to DOS (what a frightening prospect!)
move.l d5,d0
rts
MakeName:
;lib name in d5
movea.l a4,a1
move.l a1,d1 ;put in d1 for Open()
pthn move.b (a0)+,(a1)+
bne.s pthn
subq.l #1,a1
movea.l d5,a0
libn move.b (a0)+,(a1)+
bne.s libn
rts
;This makes an alert message out of the passed string in a1
;and displays it in our CON window, or as an Alert. 80 chars MAX in string.
;Uses a6, d2, d3. IntuitionBase in d7, DOSBase in a5, CONwindowHandle in d6.
dsp_alert:
suba.w #100,sp ;local buffer
movea.l sp,a0
addq.l #2,a0 ;for Alert, skip X pos
moveq #20,d0
move.b d0,(a0)+ ;y co-ordinate = 20
move.l a0,d2 ;start of string for _LVOWrite
;---copy passed string to buffer and get numOfChars
movea.l a1,a6
moveq #80-1,d0
lens move.b (a6)+,(a0)+
Dbeq d0,lens(pc)
subq.l #1,a6
suba.l a1,a6 ;numOfChars (not counting NULL)
;---If our CON window open, write the msg there
move.l d6,d1
beq.s WBalert
moveq #10,d0
move.b d0,-(a0)
move.l a6,d3
addq.l #1,d3
movea.l a5,a6
jsr _LVOWrite(a6)
bra.s frbf
;---If no CON window, post an alert
WBalert:
clr.b (a0) ;continuation byte = 0
;---center the string by adjusting the x position
moveq #80-1,d1 ;80 chars MAX
sub.l a6,d1
bcc.s aler
moveq #1,d1
aler lsr.l #1,d1
lsl.w #3,d1
movea.l d2,a0
subq.l #3,a0
move.w d1,(a0) ;x co-ordinate = (numOfChars/2) * 8 (WORD)
;---display the alert
moveq #50,d1 ;Height
moveq #0,d0 ;RECOVERY_ALERT
movea.l d7,a6
jsr _LVODisplayAlert(a6)
movea.l a5,a6 ;make sure that we get DOSBase back
frbf adda.w #100,sp
rts
;================== MODIFY THESE VARIABLES ==============
NamePtrs dc.l ReqLib ;change these to add or subtract libs
dc.l TextName
dc.l DisEdName
dc.l ILBMlib
dc.l ColorLib
dc.l 0 ;table MUST end with a 0 LONG
;These are the libraries I want to copy to the boot disk
ReqLib dc.b 'requester.library',0
ILBMlib dc.b 'ilbm.library',0
ColorLib dc.b 'color.library',0
TextName dc.b 'text_ed.library',0
DisEdName dc.b 'dised.library',0
;This is where InstallLibs is supposed to find them. For example, I put all
;my libs in a drawer called "libs", and placed InstallLibs in this drawer's
;parent.
PathName dc.b 'libs/',0
;==================== Don't touch this stuff ======================
SysName dc.b 'libs:',0
Success dc.b 'installation successful',0
Failure dc.b 'installion failure',0
CONspec dc.b 'CON:10/10/500/125/InstallLibs',0